5009a2b4570474f4588026bc406651b1ba5711be,python/src/com/jetbrains/python/validation/CompatibilityVisitor.java,CompatibilityVisitor,highlightIncorrectArguments,#PyCallExpression#,705

Before Change


        }
        else {
          if (seenPositionalContainer) {
            for (LanguageLevel level : myVersionsToProcess) {
              if (level.isOlderThan(LanguageLevel.PYTHON35)) {
                registerProblem(argument, "Python versions < 3.5 do not allow duplicate *expressions", new PyRemoveArgumentQuickFix());
                break;
              }
            }
          }
          seenPositionalContainer = true;

After Change



    boolean seenKeywordArgument = false;
    boolean seenKeywordContainer = false;
    boolean seenPositionalContainer = false;

    for (PyExpression argument : callExpression.getArguments()) {
      if (argument instanceof PyKeywordArgument) {
        final String keyword = ((PyKeywordArgument)argument).getKeyword();

        if (keywordArgumentNames.contains(keyword)) {
          registerProblem(argument, "Keyword argument repeated", new PyRemoveArgumentQuickFix());
        }
        else if (seenPositionalContainer) {
          registerFirst(argument,
                        "Python versions < 2.6 do not allow keyword arguments after *expression",
                        new PyRemoveArgumentQuickFix(),
                        myVersionsToProcess,
                        level -> level.isOlderThan(LanguageLevel.PYTHON26));
        }
        else if (seenKeywordContainer) {
          registerFirst(argument,
                        "Python versions < 3.5 do not allow keyword arguments after **expression",
                        new PyRemoveArgumentQuickFix(),
                        myVersionsToProcess,
                        level -> level.isOlderThan(LanguageLevel.PYTHON35));
        }

        seenKeywordArgument = true;
        keywordArgumentNames.add(keyword);
      }
      else if (argument instanceof PyStarArgument) {
        final PyStarArgument starArgument = (PyStarArgument)argument;
        if (starArgument.isKeyword()) {
          if (seenKeywordContainer) {
            registerFirst(argument,
                          "Python versions < 3.5 do not allow duplicate **expressions",
                          new PyRemoveArgumentQuickFix(),
                          myVersionsToProcess,
                          level -> level.isOlderThan(LanguageLevel.PYTHON35));
          }
          seenKeywordContainer = true;
        }
        else {
          if (seenPositionalContainer) {
            registerFirst(argument,
                          "Python versions < 3.5 do not allow duplicate *expressions",
                          new PyRemoveArgumentQuickFix(),
                          myVersionsToProcess,
                          level -> level.isOlderThan(LanguageLevel.PYTHON35));
          }
          seenPositionalContainer = true;
        }